from django.db import models

# Create your models here.

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models




# CustomUserManager 继承自 BaseUserManager，并重写了两个关键方法：create_user 和 create_superuser。
#
# 一， create_user: 用于创建普通用户。它接受一个标识符 (identifier) 作为用户名，并且可以选择性地提供密码和其他额外字段。
# 一， 这里还设定了用户的类型 (user_type) 默认为 'student'。如果未提供标识符，则会抛出一个 ValueError。


# 二， create_superuser: 用于创建超级用户。
# 二， 它自动设置 is_staff 和 is_superuser 属性为 True，并将用户类型默认设置为 'admin'。然后调用 create_user 方法来创建这个超级用户。
class CustomUserManager(BaseUserManager):
    def create_user(self, identifier, password=None, user_type='student', **extra_fields):
        if not identifier:
            raise ValueError('The Identifier field must be set')
        user = self.model(identifier=identifier, user_type=user_type, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, identifier, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('user_type', 'admin')

        return self.create_user(identifier, password, **extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    USER_TYPE_CHOICES = (
        ('admin', 'Admin'),
        ('teacher', 'Teacher'),
        ('student', 'Student'),
        ('fdy', 'fdy')
    )
    # 指定identifier字段作为用户登录时的用户名字段。Django 默认使用username字段作为用户名，但是在这里我们指定了identifier字段作为替代
    identifier = models.CharField(max_length=200, unique=True)  # 统一标识符
    user_type = models.CharField(max_length=10, choices=USER_TYPE_CHOICES)
    #is_active  布尔字段，默认值为True。表示用户的账户是否处于激活状态。如果设置为False，用户将无法登录系统。
    is_active = models.BooleanField(default=True)

    # is_staff  布尔字段，默认值为False。如果设置为True，用户有权访问管理站点。
    is_staff = models.BooleanField(default=False)

    root_info = models.OneToOneField('rootone.Rootone_if', on_delete=models.CASCADE, null=True, blank=True)
    student_info = models.OneToOneField('studentapp.SStudents', on_delete=models.CASCADE, null=True, blank=True)
    teacher_info = models.OneToOneField('teacherapp.Teacher', on_delete=models.CASCADE, null=True, blank=True)

    objects = CustomUserManager()

    USERNAME_FIELD = 'identifier'
    REQUIRED_FIELDS = ['user_type']

    def __str__(self):
        return f"{self.get_user_type_display()}: {self.identifier}"

    class Meta:
        db_table = "custom_user"